From 101df329ae7d4df779230ac565a7507fda44025d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 27 Oct 2015 01:26:20 +0100 Subject: [PATCH] API: Add gtk_widget_path_iter_set_object_name() ... and gtk_widget_path_iter_get_object_name(). This allows applications that still use widget paths to use the new object names to get the correct styling. Mutter and webkit-gtk are examples here. --- docs/reference/gtk/gtk3-sections.txt | 2 + gtk/gtkcssmatcher.c | 18 ++++++++- gtk/gtkwidgetpath.c | 59 ++++++++++++++++++++++++++++ gtk/gtkwidgetpath.h | 7 ++++ 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 360a69c7e8..453fdacbaf 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -5949,6 +5949,7 @@ gtk_widget_path_iter_add_region gtk_widget_path_iter_clear_classes gtk_widget_path_iter_clear_regions gtk_widget_path_iter_get_name +gtk_widget_path_iter_get_object_name gtk_widget_path_iter_get_object_type gtk_widget_path_iter_get_siblings gtk_widget_path_iter_get_sibling_index @@ -5964,6 +5965,7 @@ gtk_widget_path_iter_list_regions gtk_widget_path_iter_remove_class gtk_widget_path_iter_remove_region gtk_widget_path_iter_set_name +gtk_widget_path_iter_set_object_name gtk_widget_path_iter_set_object_type gtk_widget_path_iter_set_state gtk_widget_path_length diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c index 36b6872593..71a4cba0a0 100644 --- a/gtk/gtkcssmatcher.c +++ b/gtk/gtkcssmatcher.c @@ -84,9 +84,23 @@ gtk_css_matcher_widget_path_has_name (const GtkCssMatcher *matcher, siblings = gtk_widget_path_iter_get_siblings (matcher->path.path, matcher->path.index); if (siblings && matcher->path.sibling_index != gtk_widget_path_iter_get_sibling_index (matcher->path.path, matcher->path.index)) - return g_type_is_a (gtk_widget_path_iter_get_object_type (siblings, matcher->path.sibling_index), type); + { + const char *path_name = gtk_widget_path_iter_get_object_name (siblings, matcher->path.sibling_index); + + if (path_name == NULL) + return g_type_is_a (gtk_widget_path_iter_get_object_type (siblings, matcher->path.sibling_index), type); + + return path_name == name; + } else - return g_type_is_a (gtk_widget_path_iter_get_object_type (matcher->path.path, matcher->path.index), type); + { + const char *path_name = gtk_widget_path_iter_get_object_name (matcher->path.path, matcher->path.index); + + if (path_name == NULL) + return g_type_is_a (gtk_widget_path_iter_get_object_type (matcher->path.path, matcher->path.index), type); + + return path_name == name; + } } static gboolean diff --git a/gtk/gtkwidgetpath.c b/gtk/gtkwidgetpath.c index 0c309d3d8d..f28ddc990d 100644 --- a/gtk/gtkwidgetpath.c +++ b/gtk/gtkwidgetpath.c @@ -511,6 +511,65 @@ gtk_widget_path_iter_get_sibling_index (const GtkWidgetPath *path, return elem->sibling_index; } +/** + * gtk_widget_path_iter_get_object_name: + * @path: a #GtkWidgetPath + * @pos: position to get the object name for, -1 for the path head + * + * Returns the object name that is at position @pos in the widget + * hierarchy defined in @path. + * + * Returns: the name or %NULL + * + * Since: 3.20 + **/ +const char * +gtk_widget_path_iter_get_object_name (const GtkWidgetPath *path, + gint pos) +{ + GtkPathElement *elem; + + gtk_internal_return_val_if_fail (path != NULL, NULL); + gtk_internal_return_val_if_fail (path->elems->len != 0, NULL); + + if (pos < 0 || pos >= path->elems->len) + pos = path->elems->len - 1; + + elem = &g_array_index (path->elems, GtkPathElement, pos); + return gtk_css_node_declaration_get_name (elem->decl); +} + +/** + * gtk_widget_path_iter_set_object_name: + * @path: a #GtkWidgetPath + * @pos: position to modify, -1 for the path head + * @name: (allow-none): object name to set or %NULL to unset + * + * Sets the object name for a given position in the widget hierarchy + * defined by @path. + * + * When set, the object name overrides the object type when matching + * CSS. + * + * Since: 3.20 + **/ +void +gtk_widget_path_iter_set_object_name (GtkWidgetPath *path, + gint pos, + const char *name) +{ + GtkPathElement *elem; + + gtk_internal_return_if_fail (path != NULL); + gtk_internal_return_if_fail (path->elems->len != 0); + + if (pos < 0 || pos >= path->elems->len) + pos = path->elems->len - 1; + + elem = &g_array_index (path->elems, GtkPathElement, pos); + gtk_css_node_declaration_set_name (&elem->decl, g_intern_string (name)); +} + /** * gtk_widget_path_iter_get_object_type: * @path: a #GtkWidgetPath diff --git a/gtk/gtkwidgetpath.h b/gtk/gtkwidgetpath.h index bd86434012..6ef1dbc7bd 100644 --- a/gtk/gtkwidgetpath.h +++ b/gtk/gtkwidgetpath.h @@ -72,6 +72,13 @@ GDK_AVAILABLE_IN_ALL void gtk_widget_path_iter_set_object_type (GtkWidgetPath *path, gint pos, GType type); +GDK_AVAILABLE_IN_3_20 +const char * gtk_widget_path_iter_get_object_name (const GtkWidgetPath *path, + gint pos); +GDK_AVAILABLE_IN_3_20 +void gtk_widget_path_iter_set_object_name (GtkWidgetPath *path, + gint pos, + const char *name); GDK_AVAILABLE_IN_ALL const GtkWidgetPath * gtk_widget_path_iter_get_siblings (const GtkWidgetPath *path, -- 2.30.2